Reinstate expected focus behavior
authorMatthias Clasen <mclasen@redhat.com>
Wed, 8 Apr 2020 11:43:28 +0000 (07:43 -0400)
committerMatthias Clasen <mclasen@redhat.com>
Thu, 9 Apr 2020 21:50:29 +0000 (17:50 -0400)
After the :can-focus change in the previous commit, widgets
need to set suitable focus and grab_focus implementations
to implement the desired focus behavior.

This commit does that for all widgets.

46 files changed:
gtk/gtkaccellabel.c
gtk/gtkappchooserbutton.c
gtk/gtkappchooserwidget.c
gtk/gtkbuiltinicon.c
gtk/gtkbutton.c
gtk/gtkcalendar.c
gtk/gtkcenterbox.c
gtk/gtkcolorbutton.c
gtk/gtkcolorchooserwidget.c
gtk/gtkcolorswatch.c
gtk/gtkcombobox.c
gtk/gtkcontainer.c
gtk/gtkdragicon.c
gtk/gtkdrawingarea.c
gtk/gtkentry.c
gtk/gtkexpander.c
gtk/gtkfilechooserbutton.c
gtk/gtkfilechooserwidget.c
gtk/gtkfontbutton.c
gtk/gtkfontchooserwidget.c
gtk/gtkglarea.c
gtk/gtkiconview.c
gtk/gtkimage.c
gtk/gtklevelbar.c
gtk/gtklistbox.c
gtk/gtkmediacontrols.c
gtk/gtkmenubutton.c
gtk/gtknotebook.c
gtk/gtkpasswordentry.c
gtk/gtkpicture.c
gtk/gtkprogressbar.c
gtk/gtkscale.c
gtk/gtkscrollbar.c
gtk/gtkscrolledwindow.c
gtk/gtkseparator.c
gtk/gtkshortcutlabel.c
gtk/gtkshortcutsshortcut.c
gtk/gtkspinbutton.c
gtk/gtkspinner.c
gtk/gtkstacksidebar.c
gtk/gtkstackswitcher.c
gtk/gtkstatusbar.c
gtk/gtkswitch.c
gtk/gtktextview.c
gtk/gtktreeview.c
gtk/gtkvideo.c

index 7b83dbad5bfa06d761c0c0de7fce7b15a5759a46..78b40ef8872b5619d98f46e08f7edeb58d2e2429 100644 (file)
@@ -128,6 +128,9 @@ gtk_accel_label_class_init (GtkAccelLabelClass *class)
   gobject_class->set_property = gtk_accel_label_set_property;
   gobject_class->get_property = gtk_accel_label_get_property;
 
+  widget_class->focus = gtk_widget_focus_none;
+  widget_class->grab_focus = gtk_widget_grab_focus_none;
+
   gtk_widget_class_set_accessible_role (widget_class, ATK_ROLE_ACCEL_LABEL);
 
   props[PROP_LABEL] =
index 4c8dc45ee415f1f3a829cb4953164fcdee45265b..0580b5a33326cb40105b11f0ec73562de03a936e 100644 (file)
@@ -57,6 +57,7 @@
 #include "gtkcellrendererpixbuf.h"
 #include "gtkcellrenderertext.h"
 #include "gtkcombobox.h"
+#include "gtkwidgetprivate.h"
 #include "gtkdialog.h"
 #include "gtkintl.h"
 #include "gtkmarshalers.h"
@@ -667,6 +668,8 @@ gtk_app_chooser_button_class_init (GtkAppChooserButtonClass *klass)
 
   widget_class->measure = gtk_app_chooser_button_measure;
   widget_class->size_allocate = gtk_app_chooser_button_size_allocate;
+  widget_class->grab_focus = gtk_widget_grab_focus_child;
+  widget_class->focus = gtk_widget_focus_child;
 
   g_object_class_override_property (oclass, PROP_CONTENT_TYPE, "content-type");
 
index bc1c0ffe173c151f1c03caedf673236ea3f7e21c..91e22c7c49330b69efbc5343b575e1be51b88cce 100644 (file)
@@ -38,6 +38,7 @@
 #include "gtkscrolledwindow.h"
 #include "gtklabel.h"
 #include "gtkgestureclick.h"
+#include "gtkwidgetprivate.h"
 
 #include <string.h>
 #include <glib/gi18n-lib.h>
@@ -913,7 +914,8 @@ gtk_app_chooser_widget_class_init (GtkAppChooserWidgetClass *klass)
   widget_class->measure = gtk_app_chooser_widget_measure;
   widget_class->size_allocate = gtk_app_chooser_widget_size_allocate;
   widget_class->snapshot = gtk_app_chooser_widget_snapshot;
-
+  widget_class->grab_focus = gtk_widget_grab_focus_child;
+  widget_class->focus = gtk_widget_focus_child;
 
   g_object_class_override_property (gobject_class, PROP_CONTENT_TYPE, "content-type");
 
index b91864db44410bf1f0025c0239460377512ff7f4..53b0318239ce1f1f015816f8ac5e21bd0da6544a 100644 (file)
@@ -95,6 +95,8 @@ gtk_builtin_icon_class_init (GtkBuiltinIconClass *klass)
   wclass->snapshot = gtk_builtin_icon_snapshot;
   wclass->measure = gtk_builtin_icon_measure;
   wclass->css_changed = gtk_builtin_icon_css_changed;
+  wclass->grab_focus = gtk_widget_grab_focus_none;
+  wclass->focus = gtk_widget_focus_none;
 }
 
 static void
index 52165f83178eefa48081704b3cf48f83e98de214..7276d2c24dcafcbb1bc6f2f0c9d2f73c60113bff 100644 (file)
@@ -68,6 +68,7 @@
 #include "gtkprivate.h"
 #include "gtkstylecontext.h"
 #include "gtktypebuiltins.h"
+#include "gtkwidgetprivate.h"
 
 #include "a11y/gtkbuttonaccessible.h"
 
@@ -204,6 +205,8 @@ gtk_button_class_init (GtkButtonClass *klass)
   widget_class->state_flags_changed = gtk_button_state_flags_changed;
   widget_class->grab_notify = gtk_button_grab_notify;
   widget_class->unmap = gtk_button_unmap;
+  widget_class->grab_focus = gtk_widget_grab_focus_self;
+  widget_class->focus = gtk_widget_focus_self;
 
   container_class->add    = gtk_button_add;
   container_class->remove = gtk_button_remove;
index f38d8ac91e20f30e1021f61f254968019ec24b9a..1f29f68c002531ce7636bf2580c1d8a6422e1b6e 100644 (file)
@@ -365,6 +365,9 @@ gtk_calendar_class_init (GtkCalendarClass *class)
   gobject_class->set_property = gtk_calendar_set_property;
   gobject_class->get_property = gtk_calendar_get_property;
 
+  widget_class->focus = gtk_widget_focus_all;
+  widget_class->grab_focus = gtk_widget_grab_focus_self;
+
   /**
    * GtkCalendar:year:
    *
index 8bd0a7fda07d4390e4c4d4ce3a6b343f661b773b..01885bb3c73b6f5bb0c7e659f1dac233747475a8 100644 (file)
@@ -199,6 +199,9 @@ gtk_center_box_class_init (GtkCenterBoxClass *klass)
   object_class->get_property = gtk_center_box_get_property;
   object_class->dispose = gtk_center_box_dispose;
 
+  widget_class->grab_focus = gtk_widget_grab_focus_child;
+  widget_class->focus = gtk_widget_focus_child;
+
   g_object_class_override_property (object_class, PROP_ORIENTATION, "orientation");
 
   g_object_class_install_property (object_class, PROP_BASELINE_POSITION,
index 76048eb185f001690b877c2946d84e14653c008f..9e06f87e76954c661ec5a1eff8c22b1d895d79e2 100644 (file)
@@ -44,6 +44,7 @@
 #include "gtkprivate.h"
 #include "gtksnapshot.h"
 #include "gtkstylecontext.h"
+#include "gtkwidgetprivate.h"
 
 
 /**
@@ -143,6 +144,9 @@ gtk_color_button_class_init (GtkColorButtonClass *klass)
   gobject_class->set_property = gtk_color_button_set_property;
   gobject_class->finalize = gtk_color_button_finalize;
 
+  widget_class->grab_focus = gtk_widget_grab_focus_child;
+  widget_class->focus = gtk_widget_focus_child;
+
   klass->color_set = NULL;
 
   /**
index 0455d074574bb9f867b3e5abdf53f799f48dc245..a6b3c5cc53fba55a6547050e02b0d538ed75e3c1 100644 (file)
@@ -30,6 +30,7 @@
 #include "gtksizegroup.h"
 #include "gtkstylecontext.h"
 #include "gtkboxlayout.h"
+#include "gtkwidgetprivate.h"
 
 #include "a11y/gtkcompositeaccessible.h"
 
@@ -709,6 +710,9 @@ gtk_color_chooser_widget_class_init (GtkColorChooserWidgetClass *class)
   object_class->set_property = gtk_color_chooser_widget_set_property;
   object_class->finalize = gtk_color_chooser_widget_finalize;
 
+  widget_class->grab_focus = gtk_widget_grab_focus_child;
+  widget_class->focus = gtk_widget_focus_child;
+
   g_object_class_override_property (object_class, PROP_RGBA, "rgba");
   g_object_class_override_property (object_class, PROP_USE_ALPHA, "use-alpha");
 
index f68003cc6936e623caebe322c2e5c70c1f3f516a..72d66192cc3c13434fdc9a96c6ea61bd903b51b3 100644 (file)
@@ -481,6 +481,8 @@ gtk_color_swatch_class_init (GtkColorSwatchClass *class)
   widget_class->snapshot = swatch_snapshot;
   widget_class->size_allocate = swatch_size_allocate;
   widget_class->state_flags_changed = swatch_state_flags_changed;
+  widget_class->grab_focus = gtk_widget_grab_focus_self;
+  widget_class->focus = gtk_widget_focus_self;
 
   g_object_class_install_property (object_class, PROP_RGBA,
       g_param_spec_boxed ("rgba", P_("RGBA Color"), P_("Color as RGBA"),
index 47e3f0cd5b847d35cbb39b5e273cbc271b4abd36..755d017178a1a5bc589e9035f702436533625fbd 100644 (file)
@@ -420,6 +420,7 @@ gtk_combo_box_class_init (GtkComboBoxClass *klass)
   widget_class->size_allocate = gtk_combo_box_size_allocate;
   widget_class->mnemonic_activate = gtk_combo_box_mnemonic_activate;
   widget_class->grab_focus = gtk_combo_box_grab_focus;
+  widget_class->focus = gtk_widget_focus_child;
   widget_class->measure = gtk_combo_box_measure;
   widget_class->unmap = gtk_combo_box_unmap;
   widget_class->destroy = gtk_combo_box_destroy;
index 7d74e4f069874c3ef5be5e6a4f7dc714eb208afd..158e763e337a86d49558f16875c4ff801eb8b30c 100644 (file)
@@ -140,6 +140,8 @@ gtk_container_class_init (GtkContainerClass *class)
   widget_class->destroy = gtk_container_destroy;
   widget_class->compute_expand = gtk_container_compute_expand;
   widget_class->get_request_mode = gtk_container_get_request_mode;
+  widget_class->grab_focus = gtk_widget_grab_focus_none;
+  widget_class->focus = gtk_widget_focus_child;
 
   class->add = gtk_container_add_unimplemented;
   class->remove = gtk_container_remove_unimplemented;
index bc13f75a9397677ba9ec720da442adc1631d4dbd..a431716e5b0737bb983a10042b6fd2d861e4124c 100644 (file)
@@ -361,6 +361,8 @@ gtk_drag_icon_class_init (GtkDragIconClass *klass)
   widget_class->size_allocate = gtk_drag_icon_size_allocate;
   widget_class->show = gtk_drag_icon_show;
   widget_class->hide = gtk_drag_icon_hide;
+  widget_class->focus = gtk_widget_focus_none;
+  widget_class->grab_focus = gtk_widget_grab_focus_none;
 
   /**
    * GtkDragIcon:child:
index f611bf39f458ad9aa2989febcea791acd1c12e9c..2dbbe6a7afe93d05530a20b1da65340c34467a8d 100644 (file)
@@ -262,6 +262,8 @@ gtk_drawing_area_class_init (GtkDrawingAreaClass *class)
 
   widget_class->measure = gtk_drawing_area_measure;
   widget_class->snapshot = gtk_drawing_area_snapshot;
+  widget_class->focus = gtk_widget_focus_none;
+  widget_class->grab_focus = gtk_widget_grab_focus_none;
 
   /**
    * GtkDrawingArea:content-width
index 5e95bd6fc3bdbffc0871fdb29910e4e891005e10..ac523bf4086304a79c38b64d076e4e4beb5d6a13 100644 (file)
@@ -437,6 +437,7 @@ gtk_entry_class_init (GtkEntryClass *class)
   widget_class->query_tooltip = gtk_entry_query_tooltip;
   widget_class->direction_changed = gtk_entry_direction_changed;
   widget_class->grab_focus = gtk_entry_grab_focus;
+  widget_class->focus = gtk_widget_focus_child;
   widget_class->mnemonic_activate = gtk_entry_mnemonic_activate;
   
   quark_entry_completion = g_quark_from_static_string ("gtk-entry-completion-key");
index 91f73aa6543b90d498b17ae91e9437db52df3202..74b393a3f9d09babe7055370538a09a90bb580df 100644 (file)
@@ -300,12 +300,13 @@ gtk_expander_class_init (GtkExpanderClass *klass)
   gobject_class->set_property = gtk_expander_set_property;
   gobject_class->get_property = gtk_expander_get_property;
 
-  widget_class->destroy              = gtk_expander_destroy;
-  widget_class->size_allocate        = gtk_expander_size_allocate;
-  widget_class->focus                = gtk_expander_focus;
-  widget_class->measure              = gtk_expander_measure;
+  widget_class->destroy = gtk_expander_destroy;
+  widget_class->size_allocate = gtk_expander_size_allocate;
+  widget_class->focus = gtk_expander_focus;
+  widget_class->grab_focus = gtk_widget_grab_focus_self;
+  widget_class->measure = gtk_expander_measure;
 
-  container_class->add    = gtk_expander_add;
+  container_class->add = gtk_expander_add;
   container_class->remove = gtk_expander_remove;
   container_class->forall = gtk_expander_forall;
 
index ce15326723b19a3676f5a43b960c2e1f348da440..e0064fc9f342a17253e42b2e92949a40c097feee 100644 (file)
@@ -61,6 +61,7 @@
 #include "gtkstylecontextprivate.h"
 #include "gtkbitmaskprivate.h"
 #include "gtkeventcontroller.h"
+#include "gtkwidgetprivate.h"
 
 /**
  * SECTION:gtkfilechooserbutton
@@ -476,6 +477,8 @@ gtk_file_chooser_button_class_init (GtkFileChooserButtonClass * class)
   widget_class->root = gtk_file_chooser_button_root;
   widget_class->mnemonic_activate = gtk_file_chooser_button_mnemonic_activate;
   widget_class->state_flags_changed = gtk_file_chooser_button_state_flags_changed;
+  widget_class->grab_focus = gtk_widget_grab_focus_child;
+  widget_class->focus = gtk_widget_focus_child;
 
   /**
    * GtkFileChooserButton::file-set:
index 689c8e9eb11432222e621a40eeb3d60c038ee664..53e7409c4e379b2ac22f7981cc27e502eb194656 100644 (file)
@@ -7222,6 +7222,8 @@ gtk_file_chooser_widget_class_init (GtkFileChooserWidgetClass *class)
   widget_class->unroot = gtk_file_chooser_widget_unroot;
   widget_class->css_changed = gtk_file_chooser_widget_css_changed;
   widget_class->size_allocate = gtk_file_chooser_widget_size_allocate;
+  widget_class->grab_focus = gtk_widget_grab_focus_child;
+  widget_class->focus = gtk_widget_focus_child;
 
   /*
    * Signals
index 1e5cf9889ec21f7989d51ddfdf8a92a383edda6c..1cad2f6c5937360215e55c458ddb2e869dc825da 100644 (file)
@@ -41,6 +41,7 @@
 #include "gtkprivate.h"
 #include "gtkseparator.h"
 #include "gtkstylecontext.h"
+#include "gtkwidgetprivate.h"
 
 #include <string.h>
 #include <stdio.h>
@@ -483,6 +484,9 @@ gtk_font_button_class_init (GtkFontButtonClass *klass)
   gobject_class->set_property = gtk_font_button_set_property;
   gobject_class->get_property = gtk_font_button_get_property;
 
+  widget_class->grab_focus = gtk_widget_grab_focus_child;
+  widget_class->focus = gtk_widget_focus_child;
+
   klass->font_set = NULL;
 
   _gtk_font_chooser_install_properties (gobject_class);
index be77f9bf5d29fc9b1181acaa7ed7ff6fb0201664..a492410331d16c183237f4245b5fdc01907e664a 100644 (file)
@@ -49,7 +49,7 @@
 #include "gtktextview.h"
 #include "gtktreeselection.h"
 #include "gtktreeview.h"
-#include "gtkwidget.h"
+#include "gtkwidgetprivate.h"
 #include "gtksettings.h"
 #include "gtkdialog.h"
 #include "gtkradiobutton.h"
@@ -737,6 +737,8 @@ gtk_font_chooser_widget_class_init (GtkFontChooserWidgetClass *klass)
   widget_class->unroot = gtk_font_chooser_widget_unroot;
   widget_class->map = gtk_font_chooser_widget_map;
   widget_class->unmap = gtk_font_chooser_widget_unmap;
+  widget_class->focus = gtk_widget_focus_child;
+  widget_class->grab_focus = gtk_widget_grab_focus_child;
 
   gobject_class->finalize = gtk_font_chooser_widget_finalize;
   gobject_class->dispose = gtk_font_chooser_widget_dispose;
index 5ee6eb4d0b5520074d5e7800e1965624254db30d..6d8ac8f342f6efc60c06a1f07ef603a5fc009afd 100644 (file)
@@ -30,6 +30,7 @@
 #include "gtkrender.h"
 #include "gtksnapshot.h"
 #include "gtknative.h"
+#include "gtkwidgetprivate.h"
 
 #include <epoxy/gl.h>
 
@@ -782,6 +783,8 @@ gtk_gl_area_class_init (GtkGLAreaClass *klass)
   widget_class->unrealize = gtk_gl_area_unrealize;
   widget_class->size_allocate = gtk_gl_area_size_allocate;
   widget_class->snapshot = gtk_gl_area_snapshot;
+  widget_class->focus = gtk_widget_focus_none;
+  widget_class->grab_focus = gtk_widget_grab_focus_none;
 
   gtk_widget_class_set_accessible_role (widget_class, ATK_ROLE_DRAWING_AREA);
 
index 508a016c19cdee3b4248545fbec4c8ad6655f2bb..163b97b8bf57d1332b218e6cb401b3f25bc1df4d 100644 (file)
@@ -350,6 +350,8 @@ gtk_icon_view_class_init (GtkIconViewClass *klass)
   widget_class->measure = gtk_icon_view_measure;
   widget_class->size_allocate = gtk_icon_view_size_allocate;
   widget_class->snapshot = gtk_icon_view_snapshot;
+  widget_class->focus = gtk_widget_focus_self;
+  widget_class->grab_focus = gtk_widget_grab_focus_self;
 
   container_class->remove = gtk_icon_view_remove;
   container_class->forall = gtk_icon_view_forall;
index da98ccc698bb864388bb351ea0210a91e4fd9265..c4ee1642cbce18b0cd95d1c89a11611615763ca3 100644 (file)
@@ -157,6 +157,8 @@ gtk_image_class_init (GtkImageClass *class)
   widget_class->measure = gtk_image_measure;
   widget_class->unrealize = gtk_image_unrealize;
   widget_class->css_changed = gtk_image_css_changed;
+  widget_class->grab_focus = gtk_widget_grab_focus_none;
+  widget_class->focus = gtk_widget_focus_none;
 
   image_props[PROP_PAINTABLE] =
       g_param_spec_object ("paintable",
index d00a03f1f34265bf8b5ff45a4cafa26b126af40f..cd9d6531dd17c02c3a02ebc236893b0c7df21c98 100644 (file)
@@ -901,6 +901,8 @@ gtk_level_bar_class_init (GtkLevelBarClass *klass)
   oclass->finalize = gtk_level_bar_finalize;
 
   wclass->direction_changed = gtk_level_bar_direction_changed;
+  wclass->grab_focus = gtk_widget_grab_focus_none;
+  wclass->focus = gtk_widget_focus_none;
 
   g_object_class_override_property (oclass, PROP_ORIENTATION, "orientation");
 
index f2cf390cde85d67cddb5eb04ac0bda0165288a5d..090ee4f2d44c2f4ceb3fd2d09cff9f7054635021 100644 (file)
@@ -436,6 +436,7 @@ gtk_list_box_class_init (GtkListBoxClass *klass)
   object_class->finalize = gtk_list_box_finalize;
   widget_class->show = gtk_list_box_show;
   widget_class->focus = gtk_list_box_focus;
+  widget_class->grab_focus = gtk_widget_grab_focus_self;
   widget_class->compute_expand = gtk_list_box_compute_expand;
   widget_class->get_request_mode = gtk_list_box_get_request_mode;
   widget_class->measure = gtk_list_box_measure;
@@ -3346,8 +3347,7 @@ gtk_list_box_row_grab_focus (GtkWidget *widget)
 
   g_return_val_if_fail (box != NULL, FALSE);
 
-  if (!GTK_WIDGET_CLASS (gtk_list_box_row_parent_class)->grab_focus (widget))
-    return FALSE;
+  gtk_widget_grab_focus_self (widget);
 
   if (box->cursor_row != row)
     gtk_list_box_update_cursor (box, row, FALSE);
index a350e6c366695093ddf11716c88cd5c2204a155b..93823f1231be287780bc0a199583aa040f2379d2 100644 (file)
@@ -25,6 +25,7 @@
 #include "gtkbutton.h"
 #include "gtkintl.h"
 #include "gtklabel.h"
+#include "gtkwidgetprivate.h"
 
 /**
  * SECTION:gtkmediacontrols
@@ -259,6 +260,8 @@ gtk_media_controls_class_init (GtkMediaControlsClass *klass)
 
   widget_class->measure = gtk_media_controls_measure;
   widget_class->size_allocate = gtk_media_controls_size_allocate;
+  widget_class->grab_focus = gtk_widget_grab_focus_none;
+  widget_class->focus = gtk_widget_focus_child;
 
   gobject_class->dispose = gtk_media_controls_dispose;
   gobject_class->get_property = gtk_media_controls_get_property;
index 0b405fbb12da150e55c73e99e5d1b3720963fad3..c210d096d0f281359e2f369d15a849a28bff5a80 100644 (file)
@@ -330,7 +330,15 @@ gtk_menu_button_focus (GtkWidget        *widget,
   if (self->popover && gtk_widget_get_visible (self->popover))
     return gtk_widget_child_focus (self->popover, direction);
   else
-    return GTK_WIDGET_CLASS (gtk_menu_button_parent_class)->focus (widget, direction);
+    return gtk_widget_child_focus (self->button, direction);
+}
+
+static gboolean
+gtk_menu_button_grab_focus (GtkWidget *widget)
+{
+  GtkMenuButton *self = GTK_MENU_BUTTON (widget);
+
+  return gtk_widget_grab_focus (self->button);
 }
 
 static void
@@ -347,6 +355,7 @@ gtk_menu_button_class_init (GtkMenuButtonClass *klass)
   widget_class->size_allocate = gtk_menu_button_size_allocate;
   widget_class->state_flags_changed = gtk_menu_button_state_flags_changed;
   widget_class->focus = gtk_menu_button_focus;
+  widget_class->grab_focus = gtk_menu_button_grab_focus;
 
   /**
    * GtkMenuButton:menu-model:
index 96b1f598e9f2363454b7e2d7975e0df33bc9f189..36a651d23cc449d78fc151f474aae65a28ce183a 100644 (file)
@@ -780,6 +780,7 @@ static void gtk_notebook_direction_changed   (GtkWidget        *widget,
                                               GtkTextDirection  previous_direction);
 static gboolean gtk_notebook_focus           (GtkWidget        *widget,
                                               GtkDirectionType  direction);
+static gboolean gtk_notebook_grab_focus      (GtkWidget        *widget);
 
 /*** Drag and drop Methods ***/
 static void gtk_notebook_dnd_finished_cb     (GdkDrag          *drag,
@@ -1043,6 +1044,7 @@ gtk_notebook_class_init (GtkNotebookClass *class)
   widget_class->state_flags_changed = gtk_notebook_state_flags_changed;
   widget_class->direction_changed = gtk_notebook_direction_changed;
   widget_class->focus = gtk_notebook_focus;
+  widget_class->grab_focus = gtk_notebook_grab_focus;
   widget_class->compute_expand = gtk_notebook_compute_expand;
 
   container_class->add = gtk_notebook_add;
@@ -3707,6 +3709,17 @@ gtk_notebook_focus (GtkWidget        *widget,
   return FALSE;
 }
 
+static gboolean
+gtk_notebook_grab_focus (GtkWidget *widget)
+{
+  GtkNotebook *notebook = GTK_NOTEBOOK (widget);
+
+  if (notebook->show_tabs)
+    return gtk_widget_grab_focus_self (widget);
+  else
+    return gtk_widget_grab_focus_child (widget);
+}
+
 static void
 gtk_notebook_set_focus_child (GtkContainer *container,
                               GtkWidget    *child)
index b6f202f247df0d6669b217314512a7e994d71332..8474b52152fb925924695e9f8e8cb07a02e1d32f 100644 (file)
@@ -30,6 +30,7 @@
 #include "gtkimage.h"
 #include "gtkintl.h"
 #include "gtkprivate.h"
+#include "gtkwidgetprivate.h"
 #include "gtkmarshalers.h"
 #include "gtkstylecontext.h"
 #include "gtkeventcontrollerkey.h"
@@ -348,15 +349,6 @@ gtk_password_entry_get_accessible (GtkWidget *widget)
   return atk_obj;
 }
 
-static gboolean
-gtk_password_entry_grab_focus (GtkWidget *widget)
-{
-  GtkPasswordEntry *entry = GTK_PASSWORD_ENTRY (widget);
-  GtkPasswordEntryPrivate *priv = gtk_password_entry_get_instance_private (entry);
-
-  return gtk_widget_grab_focus (priv->entry);
-}
-
 static gboolean
 gtk_password_entry_mnemonic_activate (GtkWidget *widget,
                                       gboolean   group_cycling)
@@ -383,8 +375,10 @@ gtk_password_entry_class_init (GtkPasswordEntryClass *klass)
   widget_class->measure = gtk_password_entry_measure;
   widget_class->size_allocate = gtk_password_entry_size_allocate;
   widget_class->get_accessible = gtk_password_entry_get_accessible;
-  widget_class->grab_focus = gtk_password_entry_grab_focus;
+  widget_class->grab_focus = gtk_widget_grab_focus_child;
+  widget_class->focus = gtk_widget_focus_child;
   widget_class->mnemonic_activate = gtk_password_entry_mnemonic_activate;
+
   props[PROP_PLACEHOLDER_TEXT] =
       g_param_spec_string ("placeholder-text",
                            P_("Placeholder text"),
index 401e0a8a078bd89aa7afff89d66981996f6636b0..71d322dd9fdfda407762fa4c98cbd13ca9cb99b4 100644 (file)
@@ -301,6 +301,8 @@ gtk_picture_class_init (GtkPictureClass *class)
   widget_class->snapshot = gtk_picture_snapshot;
   widget_class->get_request_mode = gtk_picture_get_request_mode;
   widget_class->measure = gtk_picture_measure;
+  widget_class->grab_focus = gtk_widget_grab_focus_none;
+  widget_class->focus = gtk_widget_focus_none;
 
   /**
    * GtkPicture:paintable:
index c293046838c2f5ca3e37b161c4810b746ebc834a..dab0b3da3b45e59e7ba00af63bf421e5593b5d51 100644 (file)
@@ -181,6 +181,8 @@ gtk_progress_bar_class_init (GtkProgressBarClass *class)
   gobject_class->finalize = gtk_progress_bar_finalize;
 
   widget_class->direction_changed = gtk_progress_bar_direction_changed;
+  widget_class->grab_focus = gtk_widget_grab_focus_none;
+  widget_class->focus = gtk_widget_focus_none;
 
   g_object_class_override_property (gobject_class, PROP_ORIENTATION, "orientation");
 
index c9619195245359f5ed7d98d40a6e9802e249ab23..3f043c63055b137eca66cdf97c01e3dcb61b7825 100644 (file)
@@ -41,6 +41,7 @@
 #include "gtkstylecontextprivate.h"
 #include "gtkstylepropertyprivate.h"
 #include "gtktypebuiltins.h"
+#include "gtkwidgetprivate.h"
 
 #include "a11y/gtkscaleaccessible.h"
 
@@ -663,6 +664,8 @@ gtk_scale_class_init (GtkScaleClass *class)
   widget_class->snapshot = gtk_scale_snapshot;
   widget_class->size_allocate = gtk_scale_size_allocate;
   widget_class->measure = gtk_scale_measure;
+  widget_class->grab_focus = gtk_widget_grab_focus_self;
+  widget_class->focus = gtk_widget_focus_self;
 
   range_class->get_range_border = gtk_scale_get_range_border;
   range_class->value_changed = gtk_scale_value_changed;
index 84b18c02dc3d35e58584fb9ed36599fb2e9c8f9e..66cede913b3f1c3f18ad26e30393ad6c878ea837 100644 (file)
@@ -33,6 +33,7 @@
 #include "gtkorientable.h"
 #include "gtkorientableprivate.h"
 #include "gtkprivate.h"
+#include "gtkwidgetprivate.h"
 #include "gtkboxlayout.h"
 
 #include "a11y/gtkscrollbaraccessible.h"
@@ -195,6 +196,9 @@ gtk_scrollbar_class_init (GtkScrollbarClass *class)
   object_class->set_property = gtk_scrollbar_set_property;
   object_class->dispose = gtk_scrollbar_dispose;
 
+  widget_class->focus = gtk_widget_focus_none;
+  widget_class->grab_focus = gtk_widget_grab_focus_none;
+
   props[PROP_ADJUSTMENT] =
       g_param_spec_object ("adjustment",
                            P_("Adjustment"),
index 3bb8d023b881d0fbce2fffabfbf45724cbf5d04f..db66c3ff9d1720feaad0f8cbcd2ff906a0158fc0 100644 (file)
@@ -526,6 +526,7 @@ gtk_scrolled_window_class_init (GtkScrolledWindowClass *class)
   widget_class->snapshot = gtk_scrolled_window_snapshot;
   widget_class->size_allocate = gtk_scrolled_window_size_allocate;
   widget_class->focus = gtk_scrolled_window_focus;
+  widget_class->grab_focus = gtk_widget_grab_focus_self;
   widget_class->measure = gtk_scrolled_window_measure;
   widget_class->map = gtk_scrolled_window_map;
   widget_class->unmap = gtk_scrolled_window_unmap;
index 97050fa653108613a64073d0532e1c4131238a35..b83d2742289eff59e4227fd1aa75cba4c5ceb808 100644 (file)
@@ -29,6 +29,7 @@
 #include "gtkorientableprivate.h"
 #include "gtkintl.h"
 #include "gtkprivate.h"
+#include "gtkwidgetprivate.h"
 
 /**
  * SECTION:gtkseparator
@@ -141,6 +142,9 @@ gtk_separator_class_init (GtkSeparatorClass *class)
   object_class->set_property = gtk_separator_set_property;
   object_class->get_property = gtk_separator_get_property;
 
+  widget_class->grab_focus = gtk_widget_grab_focus_none;
+  widget_class->focus = gtk_widget_focus_none;
+
   g_object_class_override_property (object_class, PROP_ORIENTATION, "orientation");
 
   gtk_widget_class_set_accessible_role (widget_class, ATK_ROLE_SEPARATOR);
index 5b453edd9d5b4d084f587686698340091bb53c39..c424c5199442a9f1b4771b388ef5580664895344 100644 (file)
@@ -22,6 +22,7 @@
 #include "gtkboxlayout.h"
 #include "gtklabel.h"
 #include "gtkframe.h"
+#include "gtkwidgetprivate.h"
 #include "gtkintl.h"
 
 /**
@@ -474,6 +475,9 @@ gtk_shortcut_label_class_init (GtkShortcutLabelClass *klass)
   object_class->get_property = gtk_shortcut_label_get_property;
   object_class->set_property = gtk_shortcut_label_set_property;
 
+  widget_class->grab_focus = gtk_widget_grab_focus_none;
+  widget_class->focus = gtk_widget_focus_none;
+
   /**
    * GtkShortcutLabel:accelerator:
    *
index 0aea8286d0581db9044cc4f6783681c2a4d28d42..95407986b1529993816d1c78bcc4c4e6ce1cc970 100644 (file)
@@ -25,6 +25,7 @@
 #include "gtkintl.h"
 #include "gtklabel.h"
 #include "gtkprivate.h"
+#include "gtkwidgetprivate.h"
 #include "gtkshortcutlabel.h"
 #include "gtkshortcutswindowprivate.h"
 #include "gtksizegroup.h"
@@ -547,6 +548,8 @@ gtk_shortcuts_shortcut_class_init (GtkShortcutsShortcutClass *klass)
   widget_class->measure = gtk_shortcuts_shortcut_measure;
   widget_class->snapshot = gtk_shortcuts_shortcut_snapshot;
   widget_class->size_allocate = gtk_shortcuts_shortcut_size_allocate;
+  widget_class->grab_focus = gtk_widget_grab_focus_none;
+  widget_class->focus = gtk_widget_focus_none;
 
   /**
    * GtkShortcutsShortcut:accelerator:
index 6d610e7ef3399a7313537684c7bfeb4bc3ea88a9..c59ef30ab8cb887229643505d9669a57f5fe8f49 100644 (file)
@@ -349,6 +349,7 @@ gtk_spin_button_class_init (GtkSpinButtonClass *class)
   widget_class->grab_notify = gtk_spin_button_grab_notify;
   widget_class->state_flags_changed = gtk_spin_button_state_flags_changed;
   widget_class->grab_focus = gtk_spin_button_grab_focus;
+  widget_class->focus = gtk_widget_focus_child;
   widget_class->mnemonic_activate = gtk_spin_button_mnemonic_activate;
 
   class->input = NULL;
index cb83e568f0e38462fc916d59b5609597b554ed3d..55ae28a33dfc5d4a56c9c6f8b74ea02fc16dc332 100644 (file)
@@ -229,6 +229,8 @@ gtk_spinner_class_init (GtkSpinnerClass *klass)
   widget_class->snapshot = gtk_spinner_snapshot;
   widget_class->measure = gtk_spinner_measure;
   widget_class->css_changed = gtk_spinner_css_changed;
+  widget_class->grab_focus = gtk_widget_grab_focus_none;
+  widget_class->focus = gtk_widget_focus_none;
 
   /* GtkSpinner:spinning:
    *
index 03b909017dec977f683403c668e850b0c3a1110a..84953d78458eca1b7b05c8b1f39a65ef625cdb92 100644 (file)
@@ -32,6 +32,7 @@
 #include "gtkselectionmodel.h"
 #include "gtkstack.h"
 #include "gtkprivate.h"
+#include "gtkwidgetprivate.h"
 #include "gtkintl.h"
 
 /**
@@ -389,6 +390,9 @@ gtk_stack_sidebar_class_init (GtkStackSidebarClass *klass)
   object_class->set_property = gtk_stack_sidebar_set_property;
   object_class->get_property = gtk_stack_sidebar_get_property;
 
+  widget_class->grab_focus = gtk_widget_grab_focus_none;
+  widget_class->focus = gtk_widget_focus_child;
+
   obj_properties[PROP_STACK] =
       g_param_spec_object (I_("stack"), P_("Stack"),
                            P_("Associated stack for this GtkStackSidebar"),
index 48173692eb7af70311315ed11e7c2879c27c29a2..9e0a771f440fecf713c7607bfaa84a54dbcfe83b 100644 (file)
@@ -518,6 +518,9 @@ gtk_stack_switcher_class_init (GtkStackSwitcherClass *class)
   object_class->dispose = gtk_stack_switcher_dispose;
   object_class->finalize = gtk_stack_switcher_finalize;
 
+  widget_class->grab_focus = gtk_widget_grab_focus_none;
+  widget_class->focus = gtk_widget_focus_child;
+
   g_object_class_install_property (object_class,
                                    PROP_STACK,
                                    g_param_spec_object ("stack",
index 0bf52f35f8d1fe0a830737ef9c26807493088ff5..8484ce0d871e2a22afc21fd753fc2baa3cbbca01 100644 (file)
@@ -36,6 +36,7 @@
 #include "gtkintl.h"
 #include "gtkorientable.h"
 #include "gtktypebuiltins.h"
+#include "gtkwidgetprivate.h"
 #include "a11y/gtkstatusbaraccessible.h"
 
 /**
@@ -151,6 +152,8 @@ gtk_statusbar_class_init (GtkStatusbarClass *class)
   object_class->dispose = gtk_statusbar_dispose;
 
   widget_class->destroy = gtk_statusbar_destroy;
+  widget_class->grab_focus = gtk_widget_grab_focus_none;
+  widget_class->focus = gtk_widget_focus_child;
 
   class->text_pushed = gtk_statusbar_update;
   class->text_popped = gtk_statusbar_update;
index a62a83b1e2f22563c2d462586123ce8526e19080..ffc7371c732e9fc7cfafa2213674602fdd558ebd 100644 (file)
@@ -548,6 +548,9 @@ gtk_switch_class_init (GtkSwitchClass *klass)
 
   g_object_class_install_properties (gobject_class, LAST_PROP, switch_props);
 
+  widget_class->grab_focus = gtk_widget_grab_focus_self;
+  widget_class->focus = gtk_widget_focus_self;
+
   klass->activate = gtk_switch_activate;
   klass->state_set = state_set;
 
index dd0bbe71dd9c22e3d76036afeee55c79ebf68ae8..a7d8c5504cbed1d0209a65cee84d78a3f53f0a85 100644 (file)
@@ -421,8 +421,6 @@ static void gtk_text_view_motion               (GtkEventController *controller,
                                                 gpointer            user_data);
 static void gtk_text_view_snapshot             (GtkWidget        *widget,
                                                 GtkSnapshot      *snapshot);
-static gboolean gtk_text_view_focus            (GtkWidget        *widget,
-                                                GtkDirectionType  direction);
 static void gtk_text_view_select_all           (GtkWidget        *widget,
                                                 gboolean          select);
 static gboolean get_middle_click_paste         (GtkTextView      *text_view);
@@ -823,7 +821,8 @@ gtk_text_view_class_init (GtkTextViewClass *klass)
   widget_class->measure = gtk_text_view_measure;
   widget_class->size_allocate = gtk_text_view_size_allocate;
   widget_class->snapshot = gtk_text_view_snapshot;
-  widget_class->focus = gtk_text_view_focus;
+  widget_class->grab_focus = gtk_widget_grab_focus_self;
+  widget_class->focus = gtk_widget_focus_all;
 
   container_class->add = gtk_text_view_add;
   container_class->remove = gtk_text_view_remove;
@@ -5679,39 +5678,6 @@ gtk_text_view_snapshot (GtkWidget   *widget,
     }
 }
 
-static gboolean
-gtk_text_view_focus (GtkWidget        *widget,
-                     GtkDirectionType  direction)
-{
-  gboolean result;
-
-  if (!gtk_widget_is_focus (widget) &&
-      gtk_widget_get_focus_child (widget) == NULL)
-    {
-      if (gtk_widget_get_can_focus (widget))
-        {
-          gtk_widget_grab_focus (widget);
-          return TRUE;
-        }
-
-      return FALSE;
-    }
-  else
-    {
-      gboolean can_focus;
-      /*
-       * Unset CAN_FOCUS flag so that gtk_container_focus() allows
-       * children to get the focus
-       */
-      can_focus = gtk_widget_get_can_focus (widget);
-      gtk_widget_set_can_focus (widget, FALSE);
-      result = GTK_WIDGET_CLASS (gtk_text_view_parent_class)->focus (widget, direction);
-      gtk_widget_set_can_focus (widget, can_focus);
-
-      return result;
-    }
-}
-
 /*
  * Container
  */
index 6d68907a5ad08c33f5241ab6fffb1b48e63427c5..83daf4f48723f003608af7fe5aa631a047a85304 100644 (file)
@@ -7852,9 +7852,6 @@ gtk_tree_view_focus (GtkWidget        *widget,
   GtkTreeView *tree_view = GTK_TREE_VIEW (widget);
   GtkWidget *focus_child;
 
-  if (!gtk_widget_is_sensitive (widget) || !gtk_widget_get_can_focus (widget))
-    return FALSE;
-
   focus_child = gtk_widget_get_focus_child (widget);
 
   gtk_tree_view_stop_editing (GTK_TREE_VIEW (widget), FALSE);
@@ -7898,7 +7895,7 @@ gtk_tree_view_focus (GtkWidget        *widget,
 static gboolean
 gtk_tree_view_grab_focus (GtkWidget *widget)
 {
-  if (!GTK_WIDGET_CLASS (gtk_tree_view_parent_class)->grab_focus (widget))
+  if (!gtk_widget_grab_focus_self (widget))
     return FALSE;
 
   gtk_tree_view_focus_to_cursor (GTK_TREE_VIEW (widget));
index 1ae48bcddcdc19859a600931e1c1ed988980be7a..78f8ea080cad2f91ac1bc4ed0a8ea6a13a78772f 100644 (file)
@@ -30,6 +30,7 @@
 #include "gtknative.h"
 #include "gtkpicture.h"
 #include "gtkrevealer.h"
+#include "gtkwidgetprivate.h"
 
 /**
  * SECTION:gtkvideo
@@ -252,6 +253,8 @@ gtk_video_class_init (GtkVideoClass *klass)
   widget_class->unrealize = gtk_video_unrealize;
   widget_class->map = gtk_video_map;
   widget_class->unmap = gtk_video_unmap;
+  widget_class->grab_focus = gtk_widget_grab_focus_none;
+  widget_class->focus = gtk_widget_focus_child;
 
   gobject_class->dispose = gtk_video_dispose;
   gobject_class->get_property = gtk_video_get_property;